<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" >

  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/turbolinks/5.2.0/turbolinks.js" integrity="sha256-iM4Yzi/zLj/IshPWMC1IluRxTtRjMqjPGd97TZ9yYpU=" crossorigin="anonymous"></script>
  <link href="https://fonts.googleapis.com/css?family=Roboto+Mono" rel="stylesheet">
  <link href="https://fonts.googleapis.com/css?family=Cousine|Inconsolata" rel="stylesheet">
  <link rel="shortcut icon" type="image/png" href="/favicon.png">

  <link rel="stylesheet" href="/css/style.css">
  <link rel="stylesheet" href="/css/css/fontawesome-all.min.css">
  <link rel="stylesheet" href="/css/css/work-sans-v7.css">
  <script src="/js/main.js"></script>

  <!-- Begin Jekyll SEO tag v2.6.1 -->
<title>PY: Edit Content Patching | Hive Developer</title>
<meta name="generator" content="Jekyll v4.0.0" />
<meta property="og:title" content="PY: Edit Content Patching" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="How to edit post content with diff_match_patch using Python." />
<meta property="og:description" content="How to edit post content with diff_match_patch using Python." />
<link rel="canonical" href="edit_content_patching.html" />
<meta property="og:url" content="edit_content_patching.html" />
<meta property="og:site_name" content="Hive Developer" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2020-08-26T11:52:22-07:00" />
<script type="application/ld+json">
{"description":"How to edit post content with diff_match_patch using Python.","mainEntityOfPage":{"@type":"WebPage","@id":"edit_content_patching.html"},"@type":"BlogPosting","url":"edit_content_patching.html","headline":"PY: Edit Content Patching","dateModified":"2020-08-26T11:52:22-07:00","datePublished":"2020-08-26T11:52:22-07:00","@context":"https://schema.org"}</script>
<!-- End Jekyll SEO tag -->


  
</head>
<body>
<header>
  <h1>
    <button type="button" class="open-nav" id="open-nav"></button>
    <a href="/"  class="logo-link"><img src="/images/logotype_black.svg" height="40" alt="Hive Developer logo"></a>
  </h1>

  
  <form action="/search/" method="get">
    <input type="text" name="q" id="search-input" placeholder="Search">
    <input type="submit" value="Search" style="display: none;">
  </form>
  

  <div id="sidebar" class="sidebar">
	
	
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/">
		<h6 class="ctrl-nav-section title">Introduction</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/#introduction-welcome">Welcome to Hive</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/quickstart/">
		<h6 class="ctrl-nav-section title">Quickstart</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/quickstart/#quickstart-choose-library">Choose Library</a></li>
						
					
						
						<li><a href="/quickstart/#quickstart-hive-full-nodes">Hive Nodes</a></li>
						
					
						
						<li><a href="/quickstart/#quickstart-testnet">Hive Testnet</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/tutorials/">
		<h6 class="ctrl-nav-section title">Tutorials</h6>
		<ul class="cont-nav-section content">
			
				
					
						<li><a href="/tutorials/#tutorials-javascript">Javascript</a></li>
					
				
					
						<li><a href="/tutorials/#tutorials-python">Python</a></li>
					
				
					
						<li><a href="/tutorials/#tutorials-ruby">Ruby</a></li>
					
				
					
						<li><a href="/tutorials/#tutorials-recipes">Recipes</a></li>
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/services/">
		<h6 class="ctrl-nav-section title">Services</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/services/#services-hive-blog">hive.blog</a></li>
						
					
						
						<li><a href="/services/#services-hivesigner">HiveSigner</a></li>
						
					
						
						<li><a href="/services/#services-jussi">Jussi</a></li>
						
					
						
						<li><a href="/services/#services-imagehoster">ImageHoster</a></li>
						
					
						
						<li><a href="/services/#services-dhf">DHF</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/apidefinitions/">
		<h6 class="ctrl-nav-section title">Appbase API</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/apidefinitions/#apidefinitions-condenser-api">Condenser Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-bridge">Bridge</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-account-by-key-api">Account By Key Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-account-history-api">Account History Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-block-api">Block Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-database-api">Database Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-debug-node-api">Debug Node Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-follow-api">Follow Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-jsonrpc">Jsonrpc</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-market-history-api">Market History Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-network-broadcast-api">Network Broadcast Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-rc-api">Rc Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-reputation-api">Reputation Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-rewards-api">Rewards Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-tags-api">Tags Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-transaction-status-api">Transaction Status Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-witness-api">Witness Api</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-broadcast-ops">Broadcast Ops</a></li>
						
					
						
						<li><a href="/apidefinitions/#apidefinitions-broadcast-ops-communities">Broadcast Ops Communities</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/resources/">
		<h6 class="ctrl-nav-section title">Resources</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/resources/#resources-overview">Overview</a></li>
						
					
						
						<li><a href="/resources/#resources-client-libs">Client Libraries</a></li>
						
					
						
						<li><a href="/resources/#resources-bluepaper">Bluepaper</a></li>
						
					
						
						<li><a href="/resources/#resources-whitepaper">Whitepaper</a></li>
						
					
						
						<li><a href="/resources/#resources-tools">Tools</a></li>
						
					
						
						<li><a href="/resources/#resources-hivesigner-libs">Hivesigner Libs</a></li>
						
					
						
						<li><a href="/resources/#resources-hive-keychain">Hive Keychain</a></li>
						
					
						
						<li><a href="/resources/#resources-developeradvocate">Community & Help</a></li>
						
					
				
			
		</ul>
	</section>
	
		
    <section class="pnl-main-nav-section main-nav-section" url="/glossary/">
		<h6 class="ctrl-nav-section title">Glossary</h6>
		<ul class="cont-nav-section content">
			
				
					
					
						
						<li><a href="/glossary/#glossary-chain-basics">Chain Basics</a></li>
						
					
						
					
						
						<li><a href="/glossary/#glossary-governance">Governance</a></li>
						
					
						
						<li><a href="/glossary/#glossary-transactions">Transactions</a></li>
						
					
						
						<li><a href="/glossary/#glossary-api">API</a></li>
						
					
						
						<li><a href="/glossary/#glossary-market">Market</a></li>
						
					
				
			
		</ul>
	</section>
	
</div>



  <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
</header>
<div class="main" id="top">
  <div class="hero">
    <h1 class="hero__h1">Hive Developer Portal </h1>
    <img class="hero__img" src="/images/honey-comb-92.png" style="position: relative; top: 10px;" />
  </div>
  <section id="tutorials-python-edit-content-patching" class="row tutorials-python-edit-content-patching">
	<h3>
		<a id="tutorials-python-edit-content-patching">
			PY: Edit Content Patching
			
		</a>
	</h3>
	
		<span class="description"><p>How to edit post content with diff_match_patch using Python.</p>
</span>
	

	<p><span class="fa-pull-left top-of-tutorial-repo-link"><span class="first-word">Full</span>, runnable src of <a href="https://gitlab.syncad.com/hive/devportal/-/tree/master/tutorials/python/tutorials/12_edit_content_patching">Edit Content Patching</a> can be downloaded as part of: <a href="https://gitlab.syncad.com/hive/devportal/-/tree/master/tutorials/python">tutorials/python</a>.</span>
<br /></p>

<p>In this tutorial we show you how to patch and update posts/comments on the <strong>Steem</strong> blockchain using the <code class="highlighter-rouge">commit</code> class found within the <a href="https://github.com/steemit/steem-python">steem-python</a> library.</p>

<h2 id="intro">Intro</h2>

<p>Being able to patch a post is critical to save resources on Steem. The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the <code class="highlighter-rouge">diff_match_patch</code> class for python to create a <code class="highlighter-rouge">patch</code> for a post or comment. We then use the <code class="highlighter-rouge">post</code> method found within the <code class="highlighter-rouge">commit</code> class in the library. It should be noted that comments and new post are both treated as <code class="highlighter-rouge">commit.post</code> operation with the only difference being that a comment/reply has got an additional parameter containing the <code class="highlighter-rouge">parent post/comment</code>. There is already a tutorial on how to create a new post so the focus of this tutorial will be on <code class="highlighter-rouge">patching</code> the content of the post. We will be using a couple of methods within the <code class="highlighter-rouge">diff_match_patch</code> class.</p>

<p><code class="highlighter-rouge">diff_main</code> - This compares two text fields to find the differences.
<code class="highlighter-rouge">diff_cleanupSemantic</code> - This reduces the number of edits by eliminating semantically trivial equalities.
<code class="highlighter-rouge">diff_levenshtein</code> - Computes the Levenshtein distance: the number of inserted, deleted or substituted characters
<code class="highlighter-rouge">patch_make</code> - Creates a patch based on the calculated differences. This method can be executed in 3 different ways based on the parameters. By using the two separate text fields in question, by using only the calculated difference, or by using the original text along with the calculated difference.
<code class="highlighter-rouge">patch_apply</code> - This applies the created patch to the original text field.</p>

<h2 id="steps">Steps</h2>

<ol>
  <li><a href="#setup"><strong>App setup</strong></a> - Library install and import. Connection to testnet</li>
  <li><a href="#userinfo"><strong>User information and steem node</strong></a> - Input user information and connection to Steem node</li>
  <li><a href="#post"><strong>Post to update</strong></a> - Input and retrieve post information</li>
  <li><a href="#patch"><strong>Patching</strong></a> - Create the patch to update the post</li>
  <li><a href="#commit"><strong>New post commit</strong></a> - Commit the post to the blockchain</li>
</ol>

<h4 id="1-app-setup-">1. App setup <a name="setup"></a></h4>

<p>In this tutorial we use 2 packages:</p>

<ul>
  <li><code class="highlighter-rouge">steem</code> - steem-python library and interaction with Blockchain</li>
  <li><code class="highlighter-rouge">diff_match_patch</code> - used to compute the difference between two text fields to create a patch</li>
</ul>

<p>We import the libraries and connect to the <code class="highlighter-rouge">testnet</code>.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">steembase</span>
<span class="kn">import</span> <span class="nn">steem</span>
<span class="kn">from</span> <span class="nn">diff_match_patch</span> <span class="kn">import</span> <span class="n">diff_match_patch</span>

<span class="n">steembase</span><span class="o">.</span><span class="n">chains</span><span class="o">.</span><span class="n">known_chains</span><span class="p">[</span><span class="s">'STEEM'</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'chain_id'</span><span class="p">:</span> <span class="s">'79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673'</span><span class="p">,</span>
    <span class="s">'prefix'</span><span class="p">:</span> <span class="s">'STX'</span><span class="p">,</span> <span class="s">'steem_symbol'</span><span class="p">:</span> <span class="s">'STEEM'</span><span class="p">,</span> <span class="s">'sbd_symbol'</span><span class="p">:</span> <span class="s">'SBD'</span><span class="p">,</span> <span class="s">'vests_symbol'</span><span class="p">:</span> <span class="s">'VESTS'</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Because this tutorial alters the blockchain we connect to a testnet so we don’t create spam on the production server.</p>

<h4 id="2-user-information-and-steem-node-">2. User information and steem node <a name="userinfo"></a></h4>

<p>We require the <code class="highlighter-rouge">private posting key</code> of the user in order for the transfer to be committed to the blockchain. This is why we are using a testnet. The values are supplied via the terminal/console before we initialise the steem class. There are some demo accounts available but we encourage you to create your own accounts on this testnet and create balances you can claim; it’s good practice.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#capture user information
</span><span class="n">username</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s">'Enter username: '</span><span class="p">)</span> <span class="c1">#demo account: cdemo
</span><span class="n">wif</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s">'Enter private POSTING key: '</span><span class="p">)</span> <span class="c1">#demo account: 5JEZ1EiUjFKfsKP32b15Y7jybjvHQPhnvCYZ9BW62H1LDUnMvHz
</span>
<span class="c1">#connect node and private active key
</span><span class="n">client</span> <span class="o">=</span> <span class="n">steem</span><span class="o">.</span><span class="n">Steem</span><span class="p">(</span><span class="n">nodes</span><span class="o">=</span><span class="p">[</span><span class="s">'https://testnet.steem.vc'</span><span class="p">],</span> <span class="n">keys</span><span class="o">=</span><span class="p">[</span><span class="n">wif</span><span class="p">])</span>
</code></pre></div></div>

<h4 id="3-post-to-update-">3. Post to update <a name="post"></a></h4>

<p>The user inputs the author and permlink of the post that they wish to edit. It should be noted that a post cannot be patched once it has been archived. We suggest referring to the <code class="highlighter-rouge">submit post</code> tutorial to create a new post before trying the patch process.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#check valid username
</span><span class="n">userinfo</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">get_account</span><span class="p">(</span><span class="n">username</span><span class="p">)</span>
<span class="k">if</span><span class="p">(</span><span class="n">userinfo</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">)</span> <span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">'Oops. Looks like user '</span> <span class="o">+</span> <span class="n">username</span> <span class="o">+</span> <span class="s">' doesn</span><span class="se">\'</span><span class="s">t exist on this chain!'</span><span class="p">)</span>
    <span class="nb">exit</span><span class="p">()</span>

<span class="n">post_author</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s">'Please enter the AUTHOR of the post you want to edit: '</span><span class="p">)</span>
<span class="n">post_permlink</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s">'Please enter the PERMLINK of the post you want to edit: '</span><span class="p">)</span>

<span class="c1">#get details of selected post
</span><span class="n">details</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">get_content</span><span class="p">(</span><span class="n">post_author</span><span class="p">,</span> <span class="n">post_permlink</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="s">'</span><span class="se">\n</span><span class="s">'</span> <span class="o">+</span> <span class="s">'Title: '</span> <span class="o">+</span> <span class="n">details</span><span class="p">[</span><span class="s">'title'</span><span class="p">])</span>
<span class="n">o_body</span> <span class="o">=</span> <span class="n">details</span><span class="p">[</span><span class="s">'body'</span><span class="p">]</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Body:'</span> <span class="o">+</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span> <span class="o">+</span> <span class="n">o_body</span> <span class="o">+</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>

<span class="n">n_body</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s">'Please enter new post content:'</span> <span class="o">+</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>
</code></pre></div></div>

<p>The user also inputs the updated text in the console/terminal. This will then give us the two text fields to compare.</p>

<h4 id="4-patching-">4. Patching <a name="patch"></a></h4>

<p>The module is initiated and the new post text is checked for validity.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#initialise the diff match patch module
</span><span class="n">dmp</span> <span class="o">=</span> <span class="n">diff_match_patch</span><span class="p">()</span>

<span class="c1">#Check for null input
</span><span class="k">if</span> <span class="p">(</span><span class="n">n_body</span> <span class="o">==</span> <span class="s">''</span><span class="p">)</span> <span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">'</span><span class="se">\n</span><span class="s">'</span> <span class="o">+</span> <span class="s">'No new post body supplied. Operation aborted'</span><span class="p">)</span>
    <span class="nb">exit</span><span class="p">()</span>
<span class="k">else</span> <span class="p">:</span>
    <span class="c1"># Check for equality
</span>    <span class="k">if</span> <span class="p">(</span><span class="n">o_body</span> <span class="o">==</span> <span class="n">n_body</span><span class="p">)</span> <span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="s">'</span><span class="se">\n</span><span class="s">'</span> <span class="o">+</span> <span class="s">'No changes made to post body. Operation aborted'</span><span class="p">)</span>
        <span class="nb">exit</span><span class="p">()</span>
</code></pre></div></div>

<p>The <code class="highlighter-rouge">diff</code> is calculated and a test is done to check the <code class="highlighter-rouge">diff</code> length against the total length of the new text to determine if it will be better to patch or just replace the text field. The value to be sent to the blockchain is then assigned to the <code class="highlighter-rouge">new_body</code> parameter.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#check for differences in the text field
</span><span class="n">diff</span> <span class="o">=</span> <span class="n">dmp</span><span class="o">.</span><span class="n">diff_main</span><span class="p">(</span><span class="n">o_body</span><span class="p">,</span> <span class="n">n_body</span><span class="p">)</span>
<span class="c1">#Reduce the number of edits by eliminating semantically trivial equalities.
</span><span class="n">dmp</span><span class="o">.</span><span class="n">diff_cleanupSemantic</span><span class="p">(</span><span class="n">diff</span><span class="p">)</span>
<span class="c1">#check patch length
</span><span class="k">if</span> <span class="p">(</span><span class="n">dmp</span><span class="o">.</span><span class="n">diff_levenshtein</span><span class="p">(</span><span class="n">diff</span><span class="p">)</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">o_body</span><span class="p">))</span> <span class="p">:</span>
    <span class="c1">#create patch
</span>    <span class="n">patch</span> <span class="o">=</span> <span class="n">dmp</span><span class="o">.</span><span class="n">patch_make</span><span class="p">(</span><span class="n">o_body</span><span class="p">,</span> <span class="n">diff</span><span class="p">)</span>
    <span class="c1">#create new text based on patch
</span>    <span class="n">patch_body</span> <span class="o">=</span> <span class="n">dmp</span><span class="o">.</span><span class="n">patch_apply</span><span class="p">(</span><span class="n">patch</span><span class="p">,</span> <span class="n">o_body</span><span class="p">)</span>
    <span class="n">new_body</span> <span class="o">=</span> <span class="n">patch_body</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">else</span> <span class="p">:</span>
    <span class="n">new_body</span> <span class="o">=</span> <span class="n">n_body</span>
</code></pre></div></div>

<h4 id="5-new-post-commit-">5. New post commit <a name="commit"></a></h4>

<p>The only new parameter is the changed body text. All the other parameters to do a commit is assigned directly from the original post entered by the user.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#commit post to blockchain with all old values and new body text
</span><span class="n">client</span><span class="o">.</span><span class="n">commit</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="n">details</span><span class="p">[</span><span class="s">'title'</span><span class="p">],</span> <span class="n">body</span><span class="o">=</span><span class="n">new_body</span><span class="p">,</span> <span class="n">author</span><span class="o">=</span><span class="n">details</span><span class="p">[</span><span class="s">'author'</span><span class="p">],</span> <span class="n">permlink</span><span class="o">=</span><span class="n">details</span><span class="p">[</span><span class="s">'permlink'</span><span class="p">],</span>
    <span class="n">json_metadata</span><span class="o">=</span><span class="n">details</span><span class="p">[</span><span class="s">'json_metadata'</span><span class="p">],</span> <span class="n">reply_identifier</span><span class="o">=</span><span class="p">(</span><span class="n">details</span><span class="p">[</span><span class="s">'parent_author'</span><span class="p">]</span> <span class="o">+</span> <span class="s">'/'</span> <span class="o">+</span> <span class="n">details</span><span class="p">[</span><span class="s">'parent_permlink'</span><span class="p">]))</span>

<span class="k">print</span><span class="p">(</span><span class="s">'</span><span class="se">\n</span><span class="s">'</span> <span class="o">+</span> <span class="s">'Content of the post has been successfully updated'</span><span class="p">)</span>
</code></pre></div></div>

<p>A simple confirmation is displayed on the screen for a successful commit.</p>

<p>We encourage users to play around with different values and data types to fully understand how this process works. You can also check the balances and transaction history on the <a href="http://condenser.steem.vc/">testnet portal</a>.</p>

<h3 id="to-run-the-tutorial">To Run the tutorial</h3>

<ol>
  <li><a href="getting_started.html">review dev requirements</a></li>
  <li><code class="highlighter-rouge">git clone https://gitlab.syncad.com/hive/devportal.git</code></li>
  <li><code class="highlighter-rouge">cd devportal/tutorials/python/12_edit_content_patching</code></li>
  <li><code class="highlighter-rouge">pip install -r requirements.txt</code></li>
  <li><code class="highlighter-rouge">python index.py</code></li>
  <li>After a few moments, you should see a prompt for input in terminal screen.</li>
</ol>

<hr />

</section>

</div>
<div class="footer">
  <a href="#">Back to top</a>
</div>
<script>
    document.getElementById("open-nav").addEventListener("click", function () {
        document.body.classList.toggle("nav-open");
    });
</script>
</body>
</html>


<script src="/js/adjust.js"></script>

